/*
 * @Author: lll 1280388921@qq.com
 * @Date: 2025-06-20 00:29:21
 * @LastEditors: lll 1280388921@qq.com
 * @LastEditTime: 2025-06-20 00:29:21
 * @FilePath: /lesson42/2.tcp/Daemon.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once

#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <cstdlib>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

using namespace std;
const string nullfile = "/dev/null";

void Daemon(const string &s = "")
{
    // 1.忽略其他异常信号
    signal(SIGPIPE, SIG_IGN);
    signal(SIGSTOP, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);

    // 2.将自己变成独立的会话
    if (fork() > 0)
        exit(0);
    setsid();

    // 3.更改当前的调用进程的工作目录
    if (!s.empty())
        chdir(s.c_str());

    // 4.关闭/重定向 标准输入，标准输出，标准错误（/dev/null）
    int fd = open(nullfile.c_str(), O_RDWR); // 读写方式
    if (fd > 0)
    {
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
        close(fd);
    }
}